package br.edu.infnet.dto;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import br.edu.infnet.model.Conta;


/**
 * The persistent class for the conta database table.
 * 
 */

public class ContaDTO implements Serializable {
	private static final long serialVersionUID = 1L;

	private int pkConta;

	private String codigo;

	private Date dtCriacao;


	private int estadoConta;

	private int fkAgencia;

	private BigDecimal limite;

	private String respnsavelAbertura;

	private String responsavelAprovacao;

	private BigDecimal saldo;

	private int tipoConta;


	private ClienteDTO cliente;

	private List<DataAniversarioDTO> dataAniversarios;

	private List<MovimentoDTO> movimentos;

	public ContaDTO() {
		cliente = new ClienteDTO();
		dataAniversarios = new ArrayList<DataAniversarioDTO>();
		movimentos = new ArrayList<MovimentoDTO>();
	}

	public int getPkConta() {
		return this.pkConta;
	}

	public void setPkConta(int pkConta) {
		this.pkConta = pkConta;
	}

	public String getCodigo() {
		return this.codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public Date getDtCriacao() {
		return this.dtCriacao;
	}

	public void setDtCriacao(Date dtCriacao) {
		this.dtCriacao = dtCriacao;
	}

	public int getEstadoConta() {
		return this.estadoConta;
	}

	public void setEstadoConta(int estadoConta) {
		this.estadoConta = estadoConta;
	}

	public int getFkAgencia() {
		return this.fkAgencia;
	}

	public void setFkAgencia(int fkAgencia) {
		this.fkAgencia = fkAgencia;
	}

	public BigDecimal getLimite() {
		return this.limite;
	}

	public void setLimite(BigDecimal limite) {
		this.limite = limite;
	}

	public String getRespnsavelAbertura() {
		return this.respnsavelAbertura;
	}

	public void setRespnsavelAbertura(String respnsavelAbertura) {
		this.respnsavelAbertura = respnsavelAbertura;
	}

	public String getResponsavelAprovacao() {
		return this.responsavelAprovacao;
	}

	public void setResponsavelAprovacao(String responsavelAprovacao) {
		this.responsavelAprovacao = responsavelAprovacao;
	}

	public BigDecimal getSaldo() {
		return this.saldo;
	}

	public void setSaldo(BigDecimal saldo) {
		this.saldo = saldo;
	}

	public int getTipoConta() {
		return this.tipoConta;
	}

	public void setTipoConta(int tipoConta) {
		this.tipoConta = tipoConta;
	}

	public ClienteDTO getCliente() {
		return this.cliente;
	}

	public void setCliente(ClienteDTO cliente) {
		this.cliente = cliente;
	}

	public List<DataAniversarioDTO> getDataAniversarios() {
		return this.dataAniversarios;
	}

	public void setDataAniversarios(List<DataAniversarioDTO> dataAniversarios) {
		this.dataAniversarios = dataAniversarios;
	}

	public DataAniversarioDTO addDataAniversario(DataAniversarioDTO dataAniversario) {
		getDataAniversarios().add(dataAniversario);
		dataAniversario.setConta(this);

		return dataAniversario;
	}

	public DataAniversarioDTO removeDataAniversario(DataAniversarioDTO dataAniversario) {
		getDataAniversarios().remove(dataAniversario);
		dataAniversario.setConta(null);

		return dataAniversario;
	}

	public List<MovimentoDTO> getMovimentos() {
		return this.movimentos;
	}

	public void setMovimentos(List<MovimentoDTO> movimentos) {
		this.movimentos = movimentos;
	}

	public MovimentoDTO addMovimento(MovimentoDTO movimento) {
		getMovimentos().add(movimento);
		movimento.setConta(this);

		return movimento;
	}

	public MovimentoDTO removeMovimento(MovimentoDTO movimento) {
		getMovimentos().remove(movimento);
		movimento.setConta(null);

		return movimento;
	}
	
	public Conta toEntity() {
		Conta dto = new Conta();
		
		/*Mapper mapper = new DozerBeanMapper();
        entity = mapper.map(this, Conta.class);*/
		
		dto.setCliente(cliente.toEntity());
		dto.setCodigo(codigo);
		dto.setDtCriacao(dtCriacao);
		dto.setEstadoConta(estadoConta);
		dto.setFkAgencia(fkAgencia);
		dto.setLimite(limite);
		dto.setPkConta(pkConta);
		dto.setRespnsavelAbertura(respnsavelAbertura);
		dto.setResponsavelAprovacao(responsavelAprovacao);
		dto.setSaldo(saldo);
		dto.setTipoConta(tipoConta);
		
		Iterator<DataAniversarioDTO> iter = dataAniversarios.iterator();
		
		while(iter.hasNext()) {
			dto.addDataAniversario(iter.next().toEntity());
		}
		
		Iterator<MovimentoDTO> iter1 = movimentos.iterator();
		
		while(iter1.hasNext()) {
			dto.addMovimento(iter1.next().toEntity());
		}

        
        return dto;
	}

	@Override
	public String toString() {
		return "ContaDTO [pkConta=" + pkConta + ", codigo=" + codigo
				+ ", dtCriacao=" + dtCriacao + ", estadoConta=" + estadoConta
				+ ", fkAgencia=" + fkAgencia + ", limite=" + limite
				+ ", respnsavelAbertura=" + respnsavelAbertura
				+ ", responsavelAprovacao=" + responsavelAprovacao + ", saldo="
				+ saldo + ", tipoConta=" + tipoConta + ", cliente=" + cliente
				+ ", dataAniversarios=" + dataAniversarios + ", movimentos="
				+ movimentos + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
		result = prime * result + fkAgencia;
		result = prime * result + pkConta;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ContaDTO other = (ContaDTO) obj;
		if (codigo == null) {
			if (other.codigo != null)
				return false;
		} else if (!codigo.equals(other.codigo))
			return false;
		if (fkAgencia != other.fkAgencia)
			return false;
		if (pkConta != other.pkConta)
			return false;
		return true;
	}
	
	


}